package org.example.v4.action;

import org.example.v4.OrderStateMachine;
import org.example.v4.enums.Event;

/**
 * AbstractOrderStateAction 抽象类，提供模板方法模式的基础实现。
 */
public abstract class AbstractOrderStateAction implements StateAction<OrderStateMachine, Event> {
    @Override
    public void handle(OrderStateMachine context, Event event) {
        try {
            if (isValidEvent(event)) {
                // 处理事件
                handleInternal(context, event);
                nextState(context);
                onEventSuccess(context);
            } else {
                onInvalidEvent(context);
            }
        } finally {
            onFinally(context);
        }
    }

    /**
     * 处理事件。
     * @param context 状态机上下文
     * @param event 触发事件
     */
    protected abstract void handleInternal(OrderStateMachine context, Event event);

    /**
     * 检查事件是否有效。
     * @param event 触发事件
     * @return 是否有效
     */
    protected abstract boolean isValidEvent(Event event);

    /**
     * 处理成功事件后的状态转换。
     * @param context 状态机上下文
     */
    protected void nextState(OrderStateMachine context) {
    }

    /**
     * 成功处理事件后的操作。
     * @param context 状态机上下文
     */
    protected void onEventSuccess(OrderStateMachine context) {
    }

    /**
     * 处理无效事件。
     * @param context 状态机上下文
     */
    protected void onInvalidEvent(OrderStateMachine context) {
    }

    /**
     * 处理事件后的清理操作。
     * @param context 状态机上下文
     */
    protected void onFinally(OrderStateMachine context) {
    }
}